﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aeroporto.bd;
using System.Data;
using Aeroporto.modelo;
using System.Windows.Forms;
using System.Collections;
using System.Data.SqlClient;
using Npgsql;

namespace Aeroporto.controle
{
    class ReservaControl
    {
        private ReservaDAO bd_reserva = new ReservaDAO();
        private DisponibilizaDAO bd_disponibiliza = new DisponibilizaDAO();

        public DataTable lista_dados(string tabela)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados(tabela);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public NpgsqlDataReader lista_maxCodReserva()
        {
            try
            {
                return bd_reserva.lista_maxCodReserva();
            }
            catch (NpgsqlException erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_novo(string tabela, string tabela2, string tabela3, string agencia)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_novo(tabela, tabela2, tabela3, agencia);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable lista_dados_disponibiliza_fila()
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_assento_fila();
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable lista_dados_disponibiliza_numero()
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_assento_numero();
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable lista_dados_disponibiliza_codAeronave(string comp)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_assento_codAeronave(comp);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable lista_dados_disponibiliza_idTrecho()
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_disponibiliza_idTrecho();
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable lista_dados_disponibiliza(string comp)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_disponibiliza(comp);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public DataTable pesquisar_nome(string comp, string nome, int grid)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.pesquisar2(comp,nome,grid);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }

        public MyMessageBox valida_reserva(string te_valor, string te_codigo, string te_nome)
        {
            if (te_valor == "" || te_nome == "")
            {
                return new MyMessageBox("Preencha todos os campos.", "Atenção campo não preenchido.:");
            }
            
                    DataTable dt = bd_reserva.lista_nextval();
                    te_codigo = dt.ToString();
                    //te_codigo = "select nextval('aeroporto_v4.reserva_seq_id');";
                    if (bd_reserva.existe_registro("reserva", "cod_reserva", te_codigo) == true)
                    {
                        return new MyMessageBox("Já existe reserva com este código.", "Reserva já existente.:");
                    }
                    else
                    {
                        return null;
                    }
        }

        public MyMessageBox valida_insert_reserva(string te_valor, string te_codigo, string te_nome)
        {
            MyMessageBox mb = valida_reserva(te_valor, te_codigo, te_nome);
            if (mb != null)
            {
                return mb;
            }
            else
            {

                if (te_codigo != "")
                {
                    int cod_reserva = int.Parse(te_codigo);
                    string nome = te_nome;
                    if (te_valor.Where(c => char.IsLetter(c)).Count() > 0)
                    {
                        return new MyMessageBox("É permitido apenas valores numéricos no Campo valor.", "Erro.:");
                    }
                    double valor = double.Parse(te_valor.Replace('.', ','));

                    IGenericModel generic_model = new ReservaModel(cod_reserva, nome, valor);
                    IGenericModel disponibiliza2 = new DisponibilizaModel(cod_reserva);

                    if (bd_reserva.gravar_dados(generic_model))
                    {
                        mb = new MyMessageBox("Reserva cadastrada com sucesso.", "OK.:");
                    }
                    else
                    {
                        mb = new MyMessageBox("Erro ao cadastrar.", "Erro ao cadastrar.:");
                    }
                }
                else
                {
                    mb = new MyMessageBox("Cod_reserva está nulo "+te_codigo+"!!","ERRO COD_RESERVA");
                }
                return mb;
            }
        }

        public MyMessageBox exclui_reserva(int cod_reservas)
        {
            return bd_reserva.excluir_tudo(cod_reservas);
        }

        public MyMessageBox valida_update_reserva(string te_valor, string te_codigo, string te_nome)
        {
            if (te_valor == "" || te_codigo == "" || te_nome == "")
            {
                return new MyMessageBox("Preencha todos os campos.", "Atenção campo não preenchido.:");
            }
            else
            {
                if(te_valor.Where(c => char.IsLetter(c)).Count() > 0)
                {
                    return new MyMessageBox("É permitido apenas valores numéricos no Campo valor.", "Erro.:");
                }
                int cod_reserva = int.Parse(te_codigo);
                string nome = te_nome;
                double valor = double.Parse(te_valor.Replace('.', ','));

                ReservaModel reserva = new ReservaModel(cod_reserva, nome, valor);

                if (bd_reserva.update_dados(reserva))
                {
                    return new MyMessageBox("Reserva atualizada com sucesso.", "OK.:");
                }
                else
                {
                    return new MyMessageBox("Erro ao atualizar dados.", "Erro ao atualizar.:");
                }
            }
        }

        internal void cancela_reserva(string cod_reserva)
        {
            bd_reserva.cancela_reserva(cod_reserva);
        }

        public DataTable lista_dados_disponibiliza_codAeronave_comCodigo(String cod_aeronave, int grid_ativo, string comp)
        {
            DataTable datatable = new DataTable();
            try
            {
                datatable = bd_reserva.lista_dados_disponibiliza_codAeronave_comCodigo(cod_aeronave, grid_ativo, comp);
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return datatable;
        }
    }
}
